//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V0.1.0
#include "app_fatfs.h"
#include <string.h>
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"

#include "../../../FatFs/source/ff.h"

static const char write_data[]="欢迎使用野火开发板STM32";//要写入的数据
static char read_data[256];//数据读取的缓存区


static void WHT_FatFS_Task(void* pvParameters)
{
    static FATFS FatFs;//定义文件系统
    static FIL file;//定义文件句柄
    UINT out_write_size;//输出写入的字节个数
    UINT out_read_size;//输出读取的字节个数
    FRESULT res;

	vTaskDelay(1000);
	printf("Flash FatFS Demo V1.0 \r\n");
	//在外部 SPI Flash 挂载文件系统，文件系统挂载时会对 SPI 设备初始化
    //初始化函数调用流程如下
    //f_mount()->find_volume()->disk_initialize->SPI_FLASH_Init()
	res = f_mount(&FatFs, "3:", 1);//挂载磁盘，挂载驱动器号3，立即挂载
	printf("res= %d\r\n", res);
	
	if(res == FR_NO_FILESYSTEM)//如果没有文件系统，则进行格式化为FAT文件系统
	{
		printf("Format is FAT file system\r\n");
        static BYTE work[FF_MAX_SS]; /* 工作缓冲区 */
        MKFS_PARM opt;               /* 格式化选项 */

        opt.fmt = FM_FAT;         /* 设置文件系统类型为FAT32 */
        opt.au_size = FF_MAX_SS;  /* 设置簇大小为4096字节 */
        opt.align = 0;            /* 对齐方式（根据需要设置） */
        opt.n_fat = 1;            /* FAT表项个数（默认值为1） */
        opt.n_root = 0;           /* 根目录项个数（通常不需要设置） */

		res = f_mkfs("3:", &opt, work, sizeof(work));//格式化磁盘为FAT系统，FDISK 分区通常用于硬盘、MMC、SDC、CFC 和 U 磁盘
		printf("res=%d\r\n",res);
		f_mount(NULL, "3:", 1);//取消挂载
		f_mount(&FatFs, "3:", 1);//再次挂载
	}
	else if (res != FR_OK)
	{
		printf("挂载文件系统ERROR Code=%d\r\n", res);
	}
	else
	{
		printf("挂载文件系统成功\r\n");
	}
	
	res = f_open(&file, "3:hello.txt", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);//打开或创建文件名
	if(res == FR_OK)
	{
		res = f_write(&file, write_data, sizeof(write_data), &out_write_size);//向打开的文件句柄fil写入数据
		if(res == FR_OK)
		{
			f_lseek(&file, 0);//将文件指针移动到开头位置
			res = f_read(&file, read_data, f_size(&file), &out_read_size);//读取文件句柄file
			if(res == FR_OK)
				printf("文件系统读取数据为：%s\r\n读取%d个字节\r\n", read_data, out_read_size);
		}
		f_close(&file);
	}
	f_mount(NULL, "3:", 1);//取消挂载
	
    for (; ;)
    {
        vTaskDelay(1000/portTICK_RATE_MS);
		printf("hello word\r\n");
    }
}


void WHT_FatFS_Install(uint8_t task_priority)
{
    xTaskCreate(WHT_FatFS_Task, "WHT_FatFS_Task", 384, NULL, task_priority, NULL);
}
